CountDownLatch和ExecutorService 线程池cachedThreadPool.submit
全部标签 我想并行执行一些不同的任务,但有一个概念,即如果任务已经排队或正在处理,则不会重新排队。我已经阅读了一些关于JavaAPI的内容,并提出了下面的代码,它似乎可以工作。任何人都可以阐明我使用的方法是否是最好的方法。任何危险(线程安全?)或更好的方法来做到这一点?代码如下:importjava.util.HashMap;importjava.util.concurrent.Future;importjava.util.concurrent.LinkedBlockingQueue;importjava.util.concurrent.ThreadPoolExecutor;importjava
我正在设计一个JavaGUI驱动的应用程序,该应用程序运行许多单独的任务,每个任务都在其自己的SwingWorker扩展类中。这是我使用的正常设计,目的是在它们自己的线程上运行任务,并仍然保持EDT自由更新GUI。每个SwingWorker都使用Executors.newCachedThreadPool在其自己的线程上启动。但是,在一个特定的类中,有一个任务需要相当长的时间来处理。该任务包含一个for循环,最多可执行六次计算。我曾想过在各自的线程中实现六个计算中的每一个以加快处理时间,但我不确定实现这个的最佳方法。是否可以同时扩展SwingWorker和实现Runnable,然后在fo
我想知道我们是否需要外部同步才能使用java.lang.Thread中的方法?例如,我们可以调用方法t1.isAlive()吗?从任何线程没有外部同步并期望它返回:trueift1hasalreadybeenstarted,falseotherwise.或者调用java.lang.Thread中的方法需要外部同步吗??publicstaticvoidmain(Stringargs[]){finaljava.lang.Threadt1=newjava.lang.Thread(newjava.lang.Runnable(){@Overridepublicvoidrun(){while(tr
这可能是我误解了我所读的内容,但在Java中终止线程的所有示例似乎都表明您必须向线程发出终止自身的信号;如果没有一些严重的风险,你不能从外面杀死它。问题是,所有关于如何“礼貌地”要求线程结束的例子都有某种循环,所以你所要做的就是在每次迭代时观察一个标志。所以,我得到的是一个线程,它执行一些只需要一段时间的事情(一系列SQL查询)。我当然可以在每个步骤后进行检查,但它们不在循环中,而且我知道没有一种非常优雅的方法来解决这个问题。这是我正在做的一个例子:newThread(newRunnable(){publicvoidrun(){//query1Connectionconn=db.get
我正在使用jdk1.6开发基于RMI的分布式系统。有时我会看到RMI运行时未能序列化对象时该线程发生的ConcurrentModificationException错误。通过同时更新从远程方法返回的对象,我可以轻松地重现该异常。但问题是我找不到那些电话的来源。RMI异常被写入stderr(在退出远程对象方法后在运行时代码中在服务器端捕获),但在客户端服务中没有匹配的异常(如果那是合法的远程调用,RemoteException将引发适当的原因)。这些异常的唯一不同之处在于它们发生在“RMITCP连接(空闲)”线程上,而不是发生在“RMITCP连接()-”之类的线程上。关于RMI中那些“空
我需要能够为当前运行的线程注入(inject)一些退出代码。我已经为此苦苦挣扎了一段时间,我终于想出了一个解决方案,这里有一些类似于我正在做的代码:publicstaticvoidinjectThreadExitCallback(finalRunnablecallback){finalcurr=Thread.currentThread();newThread(){@Overridepublicvoidrun(){try{curr.join();callback.run();}catch(InterruptedExceptionex){...logging...}}}.start();}
我习惯于看到如下所示的Java线程转储,这是由SunHotSpotJVM及其衍生产品(例如OpenJDK)生成的线程转储:"main"prio=10tid=0x00007f4020009000nid=0x538cinObject.wait()[0x00007f402891f000]java.lang.Thread.State:WAITING(onobjectmonitor)atjava.lang.Object.wait(NativeMethod)-waitingon(ajava.lang.Object)atjava.lang.Object.wait(Object.java:503)at
在JavaFX中,我有一个Controller类,它从FXML文件中提取控制组件,并具有作用于该组件的方法,此处用标签显示:publicclassViewController{@FXMLprivateLabellabelStatus;publicvoidupdateStatusLabel(Stringlabel){labelStatus.setText("Status:"+label);}}我还有一个带有run()方法的Java线程,如下所示:publicclassServerextendsThread{publicvoidrun(){super.run();}}此服务器线程处理我的特
因此,我尝试在Java中对zip文件进行只读访问,以多线程方式解压缩,因为我的ZipFile/ZipEntry标准简单单线程解决方案使用枚举和输入流以及其他结果将一个50兆的zip文件解压到内存中大约需要整整五秒钟,这最多需要一秒钟才能让我的磁盘在不解压的情况下读取。但是,整个Javazip库的同步化程度令人难以置信,这无疑是因为它都是为读/写等而抽象的。在相同的代码中,而不是使用高效的非同步只读代码。我查看了第三方Java库,它们要么是庞大的VFS库,比用大象枪打苍蝇还糟糕,要么它们具有性能优势的唯一原因是它们是多线程的大多数线程在磁盘IO上阻塞的程度。我想要做的就是将一个zip文件
我有一个多线程应用程序和一个单例类:publicfinalclassSingleton{privatestaticMyClassmc;publicstaticfinalObjectgetInstance(){if(mc==null){mc=newMyClass();}returnmc;}}当然,这在一般的多线程场景下是行不通的。但请考虑以下情况:一开始只有一个线程该线程第一次调用getInstance(),使mc初始化。之后所有其他线程都由第一个线程启动。我的假设:这应该可行,因为mc字段的初始化和对象的构造发生在启动其他线程的所有后续Thread.start()调用之前.并且线程的T